www.gusucode.com > VC++ MFC文档视图程序应用-源码程序 > VC++ MFC文档视图程序应用-源码程序/code/day06_03/codes/MFCMdi/MFCMdi.cpp
// MFCMdi.cpp : Defines the entry point for the application. // Download by http://www.NewXing.com #include "stdafx.h" #include "resource.h" class CMyDocument : public CDocument { public: DECLARE_DYNCREATE( CMyDocument ) public: CString m_strText; }; IMPLEMENT_DYNCREATE( CMyDocument, CDocument ) class CChildView : public CEditView { public: DECLARE_DYNCREATE( CChildView ) //文档数据变化后,文档使用 //UpdateAllViews 通知View virtual void OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint ); DECLARE_MESSAGE_MAP( ) public: afx_msg void OnEnChange( ); }; IMPLEMENT_DYNCREATE( CChildView, CEditView ) BEGIN_MESSAGE_MAP( CChildView, CEditView ) ON_CONTROL_REFLECT_EX( EN_CHANGE, OnEnChange ) END_MESSAGE_MAP( ) void CChildView::OnEnChange( ) { //获取View的文档 CMyDocument * pDoc = (CMyDocument *) GetDocument( ); //保存数据到文档 GetWindowText( pDoc->m_strText ); //通知其他View文档数据变化 pDoc->UpdateAllViews( this ); } void CChildView::OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint ) { //获取View的文档 CMyDocument * pDoc = (CMyDocument *) GetDocument( ); //将数据显示到窗口 SetWindowText( pDoc->m_strText ); } class CChildFrame : public CMDIChildWnd { public: DECLARE_DYNCREATE( CChildFrame ) }; IMPLEMENT_DYNCREATE( CChildFrame, CMDIChildWnd ) class CMainFrame : public CMDIFrameWnd { public: DECLARE_MESSAGE_MAP( ) public: afx_msg void OnNewView( ); }; BEGIN_MESSAGE_MAP( CMainFrame, CMDIFrameWnd ) ON_COMMAND( ID_NEWVIEW, OnNewView ) END_MESSAGE_MAP( ) void CMainFrame::OnNewView( ) { //获取MDI Child Frame窗口 CFrameWnd * pFrameWnd = GetActiveFrame( ); if( FALSE == pFrameWnd->IsKindOf( RUNTIME_CLASS(CChildFrame) ) ) { return; } CChildFrame * pChildFrame = (CChildFrame *)pFrameWnd; //获取View窗口 CChildView * pChildView = (CChildView *) pChildFrame->GetActiveView( ); //获取文档 CMyDocument * pMyDocument = (CMyDocument *) pChildView->GetDocument( ); //获取文档模板 CWinApp * pWndApp = AfxGetApp( ); POSITION pos = pWndApp->m_pDocManager-> GetFirstDocTemplatePosition( ); //m_templateList.GetHeadPosition( ); CDocTemplate * pDocTemplate = pWndApp->m_pDocManager-> GetNextDocTemplate( pos ); //m_templateList.GetNext( pos ); //使用文档模板和文档创建新 //的MDI Child Frame窗口 CChildFrame * pNewFrame = (CChildFrame *) pDocTemplate->CreateNewFrame( pMyDocument, NULL ); //刷新窗口 pDocTemplate->InitialUpdateFrame( pNewFrame, pMyDocument ); } class CMdiApp : public CWinApp { public: virtual BOOL InitInstance( ); DECLARE_MESSAGE_MAP( ) public: afx_msg void OnNew( ); }; CMdiApp theApp; BEGIN_MESSAGE_MAP( CMdiApp, CWinApp ) ON_COMMAND( ID_NEW, OnNew ) END_MESSAGE_MAP( ) BOOL CMdiApp::InitInstance( ) { CMultiDocTemplate * pDocTemplate = NULL; pDocTemplate = new CMultiDocTemplate( IDR_MAINFRM, RUNTIME_CLASS( CMyDocument ), RUNTIME_CLASS( CChildFrame ), RUNTIME_CLASS( CChildView ) ); AddDocTemplate( pDocTemplate ); CMainFrame * pMainWnd = new CMainFrame( ); pMainWnd->LoadFrame( IDR_MAINFRM ); m_pMainWnd = pMainWnd; m_pMainWnd->ShowWindow( SW_SHOW ); m_pMainWnd->UpdateWindow( ); return TRUE; } void CMdiApp::OnNew( ) { OnFileNew( ); }